/* * DArraySelector.java * * Created on December 21, 2001, 8:53 PM */ package dods.clients.importwizard; import java.lang.*; import java.util.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.*; import dods.dap.*; import gnu.regexp.*; /** * * @author Rich Honhart */ public class DArraySelector extends VariableSelector implements ActionListener { private Vector fields; private Vector defaults; protected static RE getDimensions; /** Creates a new instance of DArraySelector */ public DArraySelector(DArray arr) { Enumeration dimensions = arr.getDimensions(); JTextField field1; JTextField field2; fields = new Vector(); defaults = new Vector(); if(getDimensions == null) { try { getDimensions = new RE("\\[(\\d+):(\\d+)\\]"); } catch(REException e) { e.printStackTrace(); System.exit(1); } } setName(arr.getName()); setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); add(new JLabel(getName() + ": ")); while(dimensions.hasMoreElements()) { DArrayDimension temp = (DArrayDimension)dimensions.nextElement(); field1 = new JTextField(String.valueOf(temp.getStart())); field1.setPreferredSize(new Dimension(37, 0)); field1.addActionListener(this); field1.setActionCommand("textField"); fields.addElement(field1); defaults.addElement(field1.getText()); field2 = new JTextField(String.valueOf(temp.getStop())); field2.setPreferredSize(new Dimension(37, 0)); field2.addActionListener(this); field2.setActionCommand("textField"); fields.addElement(field2); defaults.addElement(field2.getText()); BoundsVerifier bound = new BoundsVerifier(temp.getStart(), temp.getStop()); field1.addFocusListener(bound); field2.addFocusListener(bound); if(temp.getName() != null) { try { add(new JLabel(URLDecoder.decode(temp.getName()) + "=[")); } //catch(NoClassDefFoundError e) { catch(Exception e) { add(new JLabel(temp.getName() + "=[")); } } else { add(new JLabel("[")); } add(field1); add(new JLabel(":")); add(field2); add(new JLabel("]")); } add(Box.createHorizontalGlue()); } public void actionPerformed(ActionEvent e) { super.actionPerformed(e); if(e.getActionCommand().equals("textField")) { javax.swing.FocusManager focuser = javax.swing.FocusManager.getCurrentManager(); focuser.focusNextComponent((Component)e.getSource()); } } public void addField(JTextField field) { fields.addElement(field); } public void applyCE(String ce) { if(ce.startsWith(getName())) { REMatch[] matches = getDimensions.getAllMatches(ce); if(matches.length == fields.size() / 2) { for(int i=0;i<fields.size();i+=2) { ((JTextField)fields.elementAt(i)).setText(matches[i/2].toString(1)); ((JTextField)fields.elementAt(i+1)).setText(matches[i/2].toString(2)); } } } } public String generateCE(String prefix) { String ce = prefix + getName(); for(int i=0;i<fields.size();i+=2) { ce = ce + "[" + ((JTextField)fields.elementAt(i)).getText() + ":" + ((JTextField)fields.elementAt(i+1)).getText() + "]"; } return ce; } public void reset() { setSelected(true); for(int i=0;i<fields.size();i++) { ((JTextField)fields.elementAt(i)).setText((String)defaults.elementAt(i)); } } public void setEnabled(boolean enabled) { super.setEnabled(enabled); for(int i=0;i<fields.size();i++) { ((JTextField)fields.elementAt(i)).setEnabled(enabled); } } public class BoundsVerifier extends FocusAdapter { private int upper; private int lower; public BoundsVerifier(int lowerBound, int upperBound) { lower = lowerBound; upper = upperBound; } public void focusLost(FocusEvent evt) { JTextField tf = (JTextField)evt.getComponent(); int value; try { value = new Integer(tf.getText()).intValue(); } catch(java.lang.NumberFormatException exc) { // If the user enters something that can't be parsed as a // number, set value to -1 so the field will be reset to // the lower bound. value = -1; } boolean retVal = false; if(value > upper) { tf.setText(String.valueOf(upper)); } else if(value < lower) { tf.setText(String.valueOf(lower)); } fireActionEvent(); } } }